#!/usr/bin/python
import ldap
import commands
import socket
import getopt
import ConfigParser
import sys
import posix
debug=0

salida={'Ldap': {\
                        'ldap_conn': 'ldap://',\
                        'ldap_user': '',\
                        'ldap_passwd': '',\
                        'ldap_base_app': 'ou=SapSar,o=MCR',\
                        'ldap_base_usr': 'ou=sap,ou=Servers,o=MCR',\
                        'ldap_servers': ['sf-151.pm.rosario.gov.ar','sf-151.pm.rosario.gov.ar']\
        },'Ssl': {\
                        'cacert':''\
        },'Atributos': {\
                        'visibles_usr':['VARENT-USUARIO'],\
                        'visibles_app':['VARENT-COMANDO','description'],\
        },'Salida': {\
                        'arch_salida': '/var/tmp/lautodesk'\
        }}

arch_conf="/etc/lautodesk/lautodesk.conf"


################################################################################################################
#					Funciones
###############################################################################################################
def configura():
        global arch_conf
        global salida
        config=ConfigParser.ConfigParser()
        config.read(arch_conf)
        for i in  config.sections():
                for v in config.options(i):
                        if salida.has_key(i) :
				if ((v == "ldap_servers") or (v == "visibles_usr") or (v == "visibles_app")):
                        		salida[i][v]=str(config.get(i,v)).split(',')
				else:
					salida[i][v]=config.get(i,v)
                        else:
                            salida[i]={v : config.get(i,v)}

def saca_usr():
	comando_shell='env | grep -i user='
	salidash=commands.getstatusoutput(comando_shell)
	if (salidash[0] == 0):
		ineta=str(salidash[1]).split('=')
		#print ineta
		user=ineta[1]
		return user
	else:
		return "0"
			
def saca_home():
	comando_shell='env | grep -i home='
	salidash=commands.getstatusoutput(comando_shell)
	if (salidash[0] == 0):
		ineta=str(salidash[1]).split('=')
		#print ineta
		home=ineta[1]
		return home
	else:
		return ""
			
			
def arma_base(bases,nindex):
	salida1=""
	longi=len(bases)
	salida1=",".join(bases[(longi-nindex):longi])
	return salida1

def muestra_res(res):
	for i in range(len(res)):
		print "\n---------------------------------------------------------------\nRama Ldap :",res[i][0] ,"\n---------------------------------------------------------------\n"
		for u in res[i][1].keys() :
			print  u ," = ",res[i][1][u]

def arma_dic(res):
	global salida
	atr_visibles= salida['Atributos']['visibles_usr'] + salida['Atributos']['visibles_app']
	#print atr_visibles
	sali={}
	name=""
	for i in range(len(res)):	
		name=(res[i][0].split(',')[0]).split('=')[1]
		if len(name) >0 :
			sali[name]="[Desktop Entry]\n"
			for u in res[i][1].keys() :
				if ((u in atr_visibles)) :
					if debug==1:
						print "Cadena if :",(u.split('MUNIXAPP'))[1]+" = "+res[i][1][u][0]
					if u=='MUNIXAPPExec' or u=='MUNIXAPPPath':
						sali[name]=sali[name]+(u.split('MUNIXAPP'))[1]+"[$e] = "+res[i][1][u][0]+"\n"
					else:
						sali[name]=sali[name]+(u.split('MUNIXAPP'))[1]+" = "+res[i][1][u][0]+"\n"
						if u=='MUNIXAPPComment' or u=='MUNIXAPPGenericName' or u=='MUNIXAPPName' :
							sali[name]=sali[name]+(u.split('MUNIXAPP'))[1]+"[es] = "+res[i][1][u][0]+"\n"
	return sali

################################################################################################################
#					Main
###############################################################################################################
mi_usr=saca_usr()
mi_home=saca_home()
mi_host=str(socket.gethostname())
txt_arch=""
#mi_usr="sferrar0"
salidasapp=(0,'')
try:
	opts, args = getopt.getopt(sys.argv[1:], "dvhc:u:p:s:",["debug","version","help","config=","usuario=","puesto=","servidor="])
except getopt.GetoptError, (msg, opt):
	print sys.argv[0] + ": " + msg
	print "Proba '" + sys.argv[0] + " --help' para mas info."
	sys.exit(3)
for option,value in opts:
	if option in ("-c","--config"):
		arch_conf = value
	elif option in ("-u","--usuario"):
		mi_usr=value
		#print mi_usr,value	
	elif option in ("-s","--servidor"):
		mi_host=value	
		#print mi_host,value	
	elif option in ("-d","--debug"):
		debug=1
	elif option in ("-v","--version"):
		print "Configurador dinamico de Aplicaciones de Desktop MUNIX LTSP con soporte LDAP - de KUMITS SRL  \nVersion 0 Revision 1\n"
		sys.exit(3)

	elif option in ("-h","--help"):
		print "Usar: " + sys.argv[0] + " [OPCION] "
		print "Configurador dinamico de Aplicaciones de Desktop MUNIX LTSP con soporte LDAP - de KUMITS SRL \n by Seba Ferraro Tic .. Tic .. \nVersion 0 Revision 1\n"
		print "-c, --config=ruta_archivo   Ruta completa al archivo de configuracion."
		print "-u, --usuario=nombre_usuario   Nombre de Usuario para evaluar perfil."
		print "-s, --servidor=nombre_servidor   Nombre del servidor donde inicia session."
		print "-d, --debug                 Mantiene la consola."
		print "-v, --version               Muestra la version."
		print "-h, --help                  Imprime la ayuda."
		sys.exit(3)
try:
        fh = open(arch_conf,"r")
        fh.close()
	configura()
	#print salida
except  Exception, err :
        print "\n\nImposible abrir archivo de configuracion.\nError:", arch_conf, "Error :",err
        print "\n\n\nEjecute de nuevo el programa para crear una configuracion por defecto", arch_conf
        print "\n\n\n"
        sys.exit(2)



for srv_ldap in salida['Ldap']['ldap_servers'] :
	if (salida['Ssl']['cacert'] != ""):
		ldap.set_option(ldap.OPT_X_TLS_CACERTFILE,salida['Ssl']['cacert'])
	else:
		ldap_conn="ldap://"
	sal=""
	try :
		c=ldap.initialize(salida['Ldap']['ldap_conn']+srv_ldap )
		c.simple_bind_s(salida['Ldap']['ldap_user'],salida['Ldap']['ldap_passwd'])
		print "           ------------------------------------------------------------------"
		print "                          Servidor Ldap: ",srv_ldap           
		print "           ------------------------------------------------------------------"
	except Exception ,detail:
		print "Error al conectar con ", srv_ldap, " Detalle :",detail 
	try:
		sal=""
		ldapfiltro=""
		filtrofin=""
		lapps=""
		res_usuario=c.search_s(salida['Ldap']['ldap_base_usr'],ldap.SCOPE_SUBTREE,"uid="+mi_usr,salida['Atributos']['visibles_usr'])
		if debug==1 :
			print "res usr", res_usuario, "LOng", len(res_usuario)
			muestra_res(res_usuario)
		if len(res_usuario) > 0 :
			if len(res_usuario[0][1]) > 0 :
				print "* Usuario Habilitado :",mi_usr
				ldapfiltro="(&(objectClass=MunixAppIcon)(objectClass=MunixApp)"
				if debug==1 :
					muestra_res(res_usuario)
					print "res usr 0 1", res_usuario[0][1]
				for i in range(len(res_usuario)):
                			for u in res_usuario[i][1].keys() :
						#print  u ," = ",res_usuario[i][1][u]
                        			if len(res_usuario[i][1][u])>1 :
							ldapfiltro=ldapfiltro+"(|"
							filtrofin=")"
						for app in res_usuario[i][1][u]:
							print  "App: ",app
							lapps=lapps+" "+app
							ldapfiltro=ldapfiltro+"(cn="+app+")"
				ldapfiltro=ldapfiltro+filtrofin+")"
				if debug==1:
					print "Filtro LDAP:",ldapfiltro
				try:
					res_app=c.search_s("cn=MunixApp,cn="+mi_host+","+salida['Ldap']['ldap_base_app'],ldap.SCOPE_ONELEVEL,ldapfiltro,salida['Atributos']['visibles_app'])
					if debug==1 :
                        			print res_app
                        			muestra_res(res_app)
					if len(res_app) > 0 :
						print "* App Habilitadas :",lapps , " en Servidor :",mi_host
						txt_arch=arma_dic(res_app)
						if debug==1 :
                                			muestra_res(res_app)
                                			print res_app[0][1]
                                			print "FILTRO :", ldapfiltro
							muestra_res(res_app)
							print "Debug :", txt_arch
					else:
                        			print "* No existe apps :",lapps, "en server ",mi_host
                        			base_parse=salida['Ldap']['ldap_base_app'].split(',')
				except Exception ,detail:
                			print "Error APP--- Detalle :",detail
			else:
				print "* Usuario No Habilitado :",mi_usr
				
	except Exception ,detail:
		print "Error USR --- Detalle :",detail 
		
	break
try:
	for archivos in txt_arch :
		if debug==1 :
			print " Home :",mi_home
			print " Archivo :",archivos
			print " Contenido :",txt_arch[archivos]
		if len(mi_home)>0:
			fh = open(mi_home+"/Desktop/"+archivos+".desktop","w")
		#nhost=str(socket.gethostname())
			fh.write(txt_arch[archivos])
			fh.close()	
	
except Exception ,detail:
	print "Error ARCH SAL--- Detalle :",detail 

